/**
 * Copyright (c), 上海沃恩信息科技有限公司.
 * All rights reserved.
 * Licensed under BSD (https://www.pittypat.work/bsd.html).
 */

package com.waln.authority.authentication;

import java.io.IOException;
import java.io.Writer;
import java.util.UUID;

import com.waln.authority.authentication.data.Module;

import pittypat.INavModule;
import pittypat.configuration.PittypatConfig;
import pittypat.configuration.AppConfig;
import pittypat.configuration.ModuleConfig;
import pittypat.configuration.FunctionConfig;

/**
 * 定义一个模块导航项目。
 */
final class NavModule implements INavModule {
	private Module module;
	private String url;

	/**
	 * 使用从数据服务查询到的模块信息、开发者代码和应用标识符初始化 NavModule 的新实例。
	 * 
	 * @param module
	 *            模块信息。
	 * @param developerCode
	 *            开发者代码小写形式，用于创建模块的路径。
	 * @param appIdentifier
	 *            应用标识符小写形式，用于创建模块的路径。
	 */
	public NavModule(Module module, String developerCode, String appIdentifier) {
		// 入口功能的标识符
		String entrance = "index";

		// 应用配置
		AppConfig appConfig = PittypatConfig.getCurrent().getAppConfig(developerCode, appIdentifier);

		if (appConfig != null) {
			// 模块配置
			ModuleConfig moduleConfig = appConfig.getModuleConfig(module.identifier);

			if (moduleConfig != null) {
				FunctionConfig[] funcConfigs = moduleConfig.getFunctions();

				if (funcConfigs.length > 0) {
					entrance = funcConfigs[0].getIdentifier().toLowerCase();
				}
			}
		}

		// 模块的入口路径
		this.url = String.format("~/com/%s/%s/%s/%s.html", developerCode, appIdentifier,
				module.identifier.toLowerCase(), entrance);
		this.module = module;
	}

	/**
	 * 获取模块的 Id。
	 * 
	 * @return 模块的 Id。
	 */
	@Override
	public UUID getId() {
		return this.module.id;
	}

	/**
	 * 获取模块的名称。
	 * 
	 * @return 模块的名称。
	 */
	@Override
	public String getName() {
		return this.module.name;
	}

	/**
	 * 获取模块的描述信息，通常用于作为工具提示。
	 * 
	 * @return 模块的描述信息，通常用于作为工具提示。
	 */
	@Override
	public String getDescription() {
		return this.module.description;
	}

	/**
	 * 获取模块的路径。
	 * 
	 * @return 模块的路径。
	 */
	@Override
	public String getUrl() {
		return this.url;
	}

	/**
	 * 将当前对象作为 JSON 字符串写入指定的文本流。
	 * 
	 * @param writer
	 *            目标文本流。
	 * @throws IOException
	 */
	@Override
	public void write(Writer writer) throws IOException {
		if (writer == null) {
			throw new IllegalArgumentException("writer 为 null。");
		}

		writer.write('{');

		// Id
		writer.write("\"id\":");
		pittypat.Json.write(writer, this.module.id);
		writer.write(',');

		// 模块名称
		writer.write("\"name\":");
		pittypat.Json.write(writer, this.module.name);
		writer.write(',');

		// 描述
		writer.write("\"description\":");
		pittypat.Json.write(writer, this.module.description);
		writer.write(',');

		// 描述
		writer.write("\"url\":");
		pittypat.Json.write(writer, this.url);

		writer.write('}');
	}
}
